﻿/*
** Xin YUAN, 2021, BSD (2)
*/

////////////////////////////////////////////////////////////////////////////////
#ifndef __CTL_SERVER_H__
#define __CTL_SERVER_H__
////////////////////////////////////////////////////////////////////////////////

#ifndef __CTL_DEF_H__
	#error server.h requires def.h to be included first.
#endif

#include "_system_/sys_server.h"

////////////////////////////////////////////////////////////////////////////////
namespace CTL {
////////////////////////////////////////////////////////////////////////////////

// ServerAppT<T>

template <class T>
class ServerAppT
{
private:
	typedef ServerAppT<T>  thisClass;

public:
	ServerAppT() noexcept
	{
	}
	~ServerAppT() noexcept
	{
	}

	bool Initialize() noexcept
	{
		return initialize_server_application(&_cleanup_func, this);
	}
	int32_t Run() noexcept
	{
		T* pT = static_cast<T*>(this);
		if ( !pT->DoPrepare() )
			return 1;
		return run_server_loop();
	}
	void SetExitEvent() noexcept
	{
		set_server_exit_event();
	}

protected:
	//overrideables
	bool DoPrepare() noexcept
	{
		return true;
	}
	void DoCleanup() noexcept
	{
	}

private:
	static void _cleanup_func(void* param) noexcept
	{
		thisClass* pThis = (thisClass*)param;
		T* pT = static_cast<T*>(pThis);
		pT->DoCleanup();
	}
};

////////////////////////////////////////////////////////////////////////////////
}
////////////////////////////////////////////////////////////////////////////////
#endif
////////////////////////////////////////////////////////////////////////////////
